#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=1005;
struct pas{
    double p,q;
    //按照p/q从大到小排序
    bool operator < (const pas &r){
        return p/q>r.p/r.q;
    }
}a[N];
double dp[N][N];
int t;
int n,m;
int main(void){
    scanf("%d",&t);
    for(int c=1;c<=t;c++){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++){
            scanf("%lf%lf",&a[i].p,&a[i].q);
        }
        sort(a+1,a+1+n);
        memset(dp,0,sizeof(double)*N*N);
        //dp[i][j]表示从到第i条路还有j百万时此时的逃脱概率
        //依次从第一条路累计下来
        dp[1][m]=1.;
        double ans=0;
        for(int i=1;i<=n;i++){
            for(int j=m;j>=0;j--){
                //状态转移，分为三种情况，花钱come back的和不花钱come back的递推到下一条路
                dp[i+1][j-1]+=a[i].q*dp[i][j];
                dp[i+1][j]+=dp[i][j]*(1-a[i].p-a[i].q);
                //无需come back的直接加上这条路的概率乘以从上面转移下来的dp
                ans+=dp[i][j]*a[i].p;
            }
        }
        printf("Case %d: %.5lf\n",c,ans);
    }
    return 0;
}